package utils.rsshub;

import entity.VideoItem;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.ArrayList;
import java.util.List;

/**
 * 使用DOM4J类库，格式化RSSHub获取的XML文件。
 */
@Slf4j
public class RSSHubUtil {
    private static final SAXReader reader = new SAXReader();
    private static final RSSHubConfig config = RSSHubConfig.getInstance();


    /**
     * 获取最近投币过的视频列表（6个）
     *
     * @return 视频对象列表
     */
    public static List<VideoItem> getCoinVideo() {
        log.info("RSSHub：URI：" + config.getCoinURL() + " 状态：获取投币视频列表中。");
        Document document = null;
        try {
            document = reader.read(config.getCoinURL());

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        log.info("RSSHub：URI：" + config.getCoinURL() + " 状态：成功获取投币视频列表。");
        return getItems(document);
    }

    /**
     * 获取最近收藏过的视频列表（默认收藏夹）
     *
     * @return 视频对象列表
     */
    public static List<VideoItem> getFavVideo() {
        log.info("RSSHub：URI：" + config.getCoinURL() + " 状态：获取收藏视频列表中。");
        Document document = null;
        try {
            document = reader.read(config.getFavURL());
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        log.info("RSSHub：URI：" + config.getCoinURL() + " 状态：成功获取收藏视频列表。");
        return getItems(document);
    }

    /**
     * 根据Document对象获取Item对象集合
     *
     * @param document XMl文档对象
     * @return Item对象集合
     */
    private static List<VideoItem> getItems(Document document) {
        List<VideoItem> videoItemList = new ArrayList<>();
        if (document != null) {
            List<Element> elements = document.getRootElement().element("channel").elements("item");
            for (Element element : elements) {
                VideoItem videoItem = getItemByElement(element);
                videoItemList.add(videoItem);
            }
        }
        return videoItemList;
    }

    /**
     * 根据Item节点转换为Item对象
     *
     * @param element Item节点
     * @return Item对象
     */
    private static VideoItem getItemByElement(Element element) {
        VideoItem videoItem = new VideoItem();
        videoItem.setAuthor(element.element("author").getTextTrim());
        videoItem.setDescription(element.element("description").getTextTrim());
        videoItem.setLink(element.element("link").getTextTrim());
        videoItem.setGuid(element.element("guid").getTextTrim());
        videoItem.setTitle(element.element("title").getTextTrim());
        videoItem.setPubDate(element.element("pubDate").getTextTrim());
        return videoItem;
    }
}
